home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / NOTEPAD4.ASM < prev    next >
Assembly Source File  |  1985-07-27  |  30KB  |  1,004 lines

  1.       PAGE 55,132
  2.       TITLE NOTEPAD4
  3. ;
  4. ;NotePad IV -  NON BIOS VERSION
  5. ;      Permission is granted to copy and distribute freely copies of this
  6. ;      program with the following restrictions:
  7. ;
  8. ;      1) this program be passed in the public domain
  9. ;      2) a fee, beyond the cost of the disk, not be charged
  10. ;      3) improvements not be passed on but rather sent to me
  11. ;       to check for possible incompatibilities with other programs
  12. ;
  13. ;   (Stephen) Randy Davis and Larry Weiss
  14. ;   (214)454-2426
  15. ;
  16. ;       feel free to call with bugs or questions
  17. ;
  18.  
  19. ;PARAMETERS -- MOST OF THESE MAY BE CHANGED TO ANY DESIRED VALUE
  20.  
  21. wndw_ht    equ 24             ;mark the size of the window to open
  22. wndw_wd    equ 40
  23. our_key    equ  07100H        ;scan code - ascii of key to open window
  24.                               ;now scan codes of edit keys  (AltF10)
  25. up_arrow   equ  4800H
  26. down_arrow equ  5000H
  27. left_arrow equ  4B00H
  28. right_arrow equ 4D00H
  29. del_left   equ  0008H         ;user rubout (cntrl H) key
  30. delete     equ  5300H         ;use del (lower right)
  31. insert     equ  5200H
  32. cr         equ  000DH
  33. home       equ  4700H
  34. escape     equ  001BH
  35. tab        equ  7400H         ; ^right arrow
  36. rev_tab    equ  7300H         ; ^left arrow
  37. line_ins   equ  5100H         ;pg down
  38. line_del   equ  4900H         ;pg up
  39. mark_char  equ  4F00H         ;end key
  40. print_char equ  372AH         ;PrtSc* = print note on printer
  41. file_change equ 4A2DH         ;key to update file and get a new one
  42.  
  43. blank      equ  07020H       ;define the character which is a blank
  44. attrib     equ  070H         ;and our default attribute (should agree with blank)
  45. video      equ  10H          ;video BIOS call
  46. inv_attrib equ  007H         ;inverse of 'attrib'
  47.     PAGE
  48. CSEG  SEGMENT PARA PUBLIC 'CODE'
  49.       ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING   ;STANDARD DECL FOR .COM FILE
  50.  
  51.       ORG  100H
  52.  
  53. Start:
  54.       JMP INSTALL
  55.  
  56. ;PLACE DATA AREA HERE FOR READIBILITY
  57.  
  58. COPYRITE    DB 'Copyright Stephen R. Davis, Larry Weiss 1985  All Rights Reserved'
  59.             DB '(214)454-2426'
  60. SCREENSAVE: DW (WNDW_HT * (WNDW_WD+1)) DUP (BLANK);RESERVE SPACE TO SAVE OPENED WINDOW
  61. LINESAVE:    DW WNDW_WD DUP (BLANK) ;BUFFER FOR LINE DELETE
  62.  
  63. CURSOR_POS  DW 0
  64. OLD_CUR_POS DW 0
  65. SAVESTACK   DW 0,0
  66.  
  67. REQUEST     DB 0              ;REQUEST TYPE
  68. KEY_RQST_HANDLER DD 0         ;ADDRESS OF THE ORIGINAL KEYBOARD REQUEST HANDLER
  69.  
  70. LEFT_MARG  DB   00            ;define the confines of the window
  71. RIGHT_MARG DB   00
  72. TOP_MARG   DB   00
  73. BOT_MARG   DB   00
  74. UPPER_LEFT DW   00
  75.  
  76. MARK       DW   00            ;FLAGS USED IN CHARACTER FEED
  77. FEED_START DW   00            ;ADDRESS IN BUFFER OF BEGIN...
  78. FEED_END   DW   00            ;...AND END OF FEED
  79.  
  80. DISPLAY_SEG DW    00        ;DISPLAY SEGMENT (B000 -> MONOCHROME,
  81.                 ;                 B800 -> GRAPHIX)
  82.  
  83. FILE_NM_LOC DW  00            ;ADDRESS OF FILE NAME (0 -> NO FILE)
  84. PAGE
  85. BEGIN PROC FAR                ;FAR LABEL SINCE ITS ENTERED BY INTERRUPT
  86. MAINLOOP:
  87.       MOV  CS:REQUEST,AH      ;SAVE HIS AX REGISTER
  88.  
  89.       MOV  AX,CS:FEED_START   ;ARE WE IN THE MIDDLE OF FEEDING CHARS...
  90.       CMP  AX,CS:FEED_END     ;...TO THE APPLICATION?
  91.       JZ   NOFEED             ;NO
  92.       JMP  FEED               ;YES
  93. NOFEED:
  94.       MOV  AH,CS:REQUEST      ;RESTORE USERS AX
  95.       PUSHF                   ;CALL OLD INTERRUPT HANDLER (EMULATE INT INSTRUCTION)
  96.       CALL DWORD PTR [CS:KEY_RQST_HANDLER] ;GO AHEAD AND GET THE CHARACTER
  97.       PUSHF                   ;SAVE THE FLAG RETURNED (FOR AH = 1 REQUESTS)
  98.  
  99.       CMP CS:REQUEST,00H      ;WE ARE ONLY INTERESTED IN CHAR. REQUESTS
  100.       JZ  CNTINUE
  101.       JMP FORGET_IT
  102.  
  103. CNTINUE:                      ;YES -- CHECK CHARACTER FOR 'OURS'
  104.       POPF                    ;FOR NON-TYPE 1 REQUESTS DONT NEED TO SAVE FLAGS
  105.       CMP AX,OUR_KEY
  106.       JZ  CNT_AGIN
  107.       JMP RETURN_CHAR
  108.  
  109. CNT_AGIN:                     ;WE GOT IT! GO INTO EDITOR MODE
  110.       MOV CS:SAVESTACK,SP
  111.       MOV CS:SAVESTACK+2,SS
  112.       MOV  AX,CS
  113.       MOV  SS,AX
  114.       MOV  SP,100H
  115.  
  116.       STI                     ;ENABLE INTERRUPTS WHILE PROCESSING CHARACTERS
  117.  
  118.       PUSH BP                 ;SET UP A STACK FRAME
  119.       MOV  BP,SP
  120.       SUB  SP,0EH
  121.       CALL SAVEREG
  122.       MOV  DS,AX
  123.  
  124.       CALL CALC_WINDOW        ;CALCULATE WINDOW EXTREMETIES
  125.  
  126.       CALL READ_CURSOR
  127.       MOV OLD_CUR_POS,DX      ;SAVE THE CURSOR FOR LATER RESTORING
  128.  
  129.       CALL WINDOW_SWAP        ;SWING IN THE EDIT WINDOW (WITH NOTES?)
  130.  
  131.       CALL INSERT_CR          ;PUT THE CARRIAGE RETURNS ON UNPRINTABLE COL.S
  132.  
  133.       MOV DX,CURSOR_POS       ;RESTORE CURSOR IN EDIT WINDOW
  134.       CALL PLACE_CURSOR
  135.  
  136.       CALL EDITOR             ;LET HIM EDIT IN THE WINDOW
  137.  
  138.       CALL READ_CURSOR
  139.       MOV CURSOR_POS,DX       ;SAVE CURSOR IN EDIT WINDOW FOR NEXT EDIT
  140.  
  141.       CMP  MARK,00H          ;CLEAR THE MARK POSITION (IF IT'S SET)
  142.       JZ   NOT_SET
  143.       MOV  DX,MARK
  144.       CALL READ_CHAR          ;GET THE CHARACTER...
  145.       MOV  AH,ATTRIB          ;...PUT ITS ATTRIBUTE BACK TO EVERYONE ELSE'S...
  146.       CALL WRITE_CHAR         ;...AND PUT IT BACK
  147.       MOV  MARK,00H
  148. NOT_SET:
  149.  
  150.       CALL WINDOW_SWAP        ;PUT BACK WHATEVER WAS ORIGINALLY THERE
  151.  
  152.       CALL UPDATE_FILE        ;NOW ATTEMPT TO UPDATE THE DISK FILE
  153.  
  154.       MOV DX,OLD_CUR_POS      ;RESTORE THE CURSOR POSITION
  155.       CALL PLACE_CURSOR
  156.  
  157.       CALL RESTREG
  158.       ADD  SP,0EH
  159.       POP  BP
  160.  
  161.       MOV SS,CS:SAVESTACK+2
  162.       MOV SP,CS:SAVESTACK
  163.  
  164.       MOV AH,00              ;RESTORE REQUEST TO SOMETHING DECENT
  165.       JMP MAINLOOP           ;GO GET ANOTHER CHARACTER TO RETURN HIM
  166.  
  167. RETURN_CHAR:
  168.       IRET                   ;RETURN WITH CHARACTER
  169.  
  170. ;HANDLE REQUEST TYPE 1'S BY FAR RETURNING 2 AND TYPE 2'S BY JUST RETURNING
  171.  
  172. FORGET_IT:
  173.       CMP  CS:REQUEST,1      ;was it a "is char present" request?
  174.       JZ   FI100
  175.  
  176.       POPF                   ;no -- just return whatever BIOS returned
  177.       IRET
  178.  
  179. FI100:
  180.       POPF                   ;yes -- make funny return
  181.       RET 02
  182.       PAGE
  183. ;HERE WE ARE IN THE PROCESS OF FEEDING CHARACTERS TO THE APPLICATION
  184. ;FROM THE WINDOW BUFFER (SCREENSAVE)
  185.  
  186. FEED:
  187.       CMP  CS:REQUEST,1       ;WAS THIS A CHAR TYPE REQUEST?
  188.       JA   KSTAT
  189.                               ;YES -- RETURN HIM CHAR
  190.       PUSH BX                 ;GET THE NEXT CHARACTER FROM THE BUFFER
  191.       CALL SKIP_SPACES        ;STRIP LEADING SPACES
  192.  
  193.       MOV  BX,CS:FEED_START   ;OK - GET THE NEXT CHARACTER WE NEED
  194.       MOV  AX,CS:[BX]
  195.       POP  BX
  196.       XOR  AH,AH              ;WE NO LONGER HAVE THE SCAN CODE, BUT ALL
  197.                               ;ARE ASCII ANYWAY
  198.  
  199.       CMP  CS:REQUEST,0       ;IS THIS A 'GET KEYBOARD CHAR' RQST?
  200.       JNZ  FEED_KEY_STAT
  201.  
  202.       ADD  CS:FEED_START,2    ;YES -- MOVE UP THE POINTER BY 1
  203.       IRET
  204.  
  205. FEED_KEY_STAT:
  206.       STI                     ;NO -- ENABLE INTERRUPTS AND FEED HIM THE
  207.       RET  02                 ;THE Z FLAG CLEAR WITH HIS CHAR
  208.  
  209. KSTAT:
  210.       MOV  AH,CS:REQUEST      ;RESTORE REQUEST TO AH
  211.       CALL DWORD PTR [CS:KEY_RQST_HANDLER] ;PERFORM BIOS CALL -- WE DON'T KNOW
  212.                               ;WHAT HE'S DOING AND WE SHOULDN'T GET IN THE WAY
  213.       IRET                    ;RETURN THE RESULTS TO HIM (WHATEVER THEY ARE)
  214. BEGIN ENDP
  215.       PAGE
  216. BODY  PROC NEAR               ;MAKE SHORT CALLS ONLY TO THE MAIN ROUTINES
  217.  
  218. SKIP_SPACES:
  219. ;TRY TO AVOID FEEDING SPACES WITH NOTHING AFTER THEM ON A LINE --
  220. ;JUST SKIP OVER TO THE RETURN AND FEED THAT ALONE
  221.  
  222.       MOV  BX,CS:FEED_START   ;START WITH THE NEXT FEED CHARACTER
  223. LOOK_AHEAD:
  224.       MOV  AX,CS:[BX]
  225.       CMP  AL,CR              ;IS THIS CHAR A RETURN
  226.       JZ   STRIP_SPACES
  227.       CMP  AL,' '             ;IS THIS CHARACTER ANOTHER SPACE?
  228.       JNZ  GO_ON
  229.       ADD  BX,2               ;YES -- KEEP LOOKING AHEAD
  230.       CMP  BX,CS:FEED_END     ;IS THAT IT?
  231.       JNZ  LOOK_AHEAD
  232.                               ;YES--
  233.       SUB  BX,2               ;RAN OFF THE END -- BACK UP ONE CHAR AT LEAST!
  234. STRIP_SPACES:
  235.       MOV  CS:FEED_START,BX   ;HERE WE FOUND NOTHING BUT SPACES BEFORE THE
  236.                               ;CARRIAGE RETURN -- SKIP THA